ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCAxZDRhMDkzLi4wNzdlMjA4IDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0yLDYgKzIsOSBAQAogQ2hhbmdlcyBzaW5jZSBVLUJvb3QgMS4xLjE6CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKyogUGF0Y2ggYnkgVmluY2VudCBEdWJleSwgMjQgU2VwIDIwMDQ6CisgIEFkZCBzdXBwb3J0IGZvciB4YWVuaWF4IGJvYXJkCisKICogQWRkIGNvbW1lbnQgYWJvdXQgbm9uLUdQTCBjaGFyYWN0ZXIgb2Ygc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgdG8KICAgQ09QWUlORyBmaWxlCiAKZGlmZiAtLWdpdCBhL01BS0VBTEwgYi9NQUtFQUxMCmluZGV4IDEzMWRjMzcuLjZkOTZkY2IgMTAwNjQ0Ci0tLSBhL01BS0VBTEwKKysrIGIvTUFLRUFMTApAQCAtMTQ5LDcgKzE0OSwxMSBAQAogIyMgWHNjYWxlIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9weGE9ImNlcmYyNTAgY3JhZGxlIGNzYjIyNiBpbm5va29tIGx1YmJvY2sgd2VwZXAyNTAgeG0yNTAgeHNlbmdpbmUiCitMSVNUX3B4YT0iCVwKKwljZXJmMjUwCQljcmFkbGUJCWNzYjIyNgkJaW5ub2tvbQkJXAorCWx1YmJvY2sJCXdlcGVwMjUwCXhhZW5pYXgJCXhtMjUwCQlcCisJeHNlbmdpbmUJCQkJCQkJXAorIgogCiBMSVNUX2l4cD0iaXhkcDQyNSIKIApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBjNjkzYjZhLi45NjNiZjU4IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMTMxNiw2ICsxMzE2LDkgQEAKIHdlcGVwMjUwX2NvbmZpZwk6CXVuY29uZmlnCiAJQC4vbWtjb25maWcgJChAOl9jb25maWc9KSBhcm0gcHhhIHdlcGVwMjUwCiAKK3hhZW5pYXhfY29uZmlnCToJdW5jb25maWcKKwlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIGFybSBweGEgeGFlbmlheAorCiB4bTI1MF9jb25maWcJOgl1bmNvbmZpZwogCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgYXJtIHB4YSB4bTI1MAogCmRpZmYgLS1naXQgYS9ib2FyZC94YWVuaWF4L01ha2VmaWxlIGIvYm9hcmQveGFlbmlheC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTVhNWJhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQveGFlbmlheC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChCT0FSRCkuYQorCitPQkpTCTo9IHhhZW5pYXgubyBmbGFzaC5vCitTT0JKUwk6PSBtZW1zZXR1cC5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpIGNydiAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ1BQRkxBR1MpICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykgPiAkQAorCistaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL3hhZW5pYXgvY29uZmlnLm1rIGIvYm9hcmQveGFlbmlheC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwNzlhMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3hhZW5pYXgvY29uZmlnLm1rCkBAIC0wLDAgKzEsMiBAQAorVEVYVF9CQVNFID0gMHhhM0ZCMDAwMAorI1RFWFRfQkFTRSA9IDAKZGlmZiAtLWdpdCBhL2JvYXJkL3hhZW5pYXgvZmxhc2guYyBiL2JvYXJkL3hhZW5pYXgvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODc0YTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQveGFlbmlheC9mbGFzaC5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBLeWxlIEhhcnJpcywgTmV4dXMgVGVjaG5vbG9naWVzLCBJbmMuIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CisKKworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICAgICovCisKKy8qIEJvYXJkIHN1cHBvcnQgZm9yIDEgb3IgMiBmbGFzaCBkZXZpY2VzICovCisjZGVmaW5lIEZMQVNIX1BPUlRfV0lEVEgzMgorI3VuZGVmIEZMQVNIX1BPUlRfV0lEVEgxNgorCisjaWZkZWYgRkxBU0hfUE9SVF9XSURUSDE2CisjZGVmaW5lIEZMQVNIX1BPUlRfV0lEVEgJCXVzaG9ydAorI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRIVgkJdnVfc2hvcnQKKyNkZWZpbmUgU1dBUCh4KSAgICAgICAgICAgICAgIF9fc3dhYjE2KHgpCisjZWxzZQorI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRICQl1bG9uZworI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRIVgkJdnVfbG9uZworI2RlZmluZSBTV0FQKHgpICAgICAgICAgICAgICAgX19zd2FiMzIoeCkKKyNlbmRpZgorCisjZGVmaW5lIEZQVyAgICBGTEFTSF9QT1JUX1dJRFRICisjZGVmaW5lIEZQV1YgICBGTEFTSF9QT1JUX1dJRFRIVgorCisjZGVmaW5lIG1iKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiIDogOiA6ICJtZW1vcnkiKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbnMKKyAqLworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplIChGUFcgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbyk7CitzdGF0aWMgaW50IHdyaXRlX2RhdGEgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgRlBXIGRhdGEpOworc3RhdGljIHZvaWQgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqaW5mbyk7Cit2b2lkIGlubGluZSBzcGluX3doZWVsICh2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKwlpbnQgaTsKKwl1bG9uZyBzaXplID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBDRkdfTUFYX0ZMQVNIX0JBTktTOyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWZsYXNoX2dldF9zaXplICgoRlBXICopIFBIWVNfRkxBU0hfMSwgJmZsYXNoX2luZm9baV0pOworCQkJZmxhc2hfZ2V0X29mZnNldHMgKFBIWVNfRkxBU0hfMSwgJmZsYXNoX2luZm9baV0pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWZsYXNoX2dldF9zaXplICgoRlBXICopIFBIWVNfRkxBU0hfMiwgJmZsYXNoX2luZm9baV0pOworCQkJZmxhc2hfZ2V0X29mZnNldHMgKFBIWVNfRkxBU0hfMiwgJmZsYXNoX2luZm9baV0pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYW5pYyAoImNvbmZpZ3VyZWQgdG9vIG1hbnkgZmxhc2ggYmFua3MhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXNpemUgKz0gZmxhc2hfaW5mb1tpXS5zaXplOworCX0KKworCS8qIFByb3RlY3QgbW9uaXRvciBhbmQgZW52aXJvbm1lbnQgc2VjdG9ycworCSAqLworCWZsYXNoX3Byb3RlY3QgKCBGTEFHX1BST1RFQ1RfU0VULAorCQkJQ0ZHX0ZMQVNIX0JBU0UsCisJCQlDRkdfRkxBU0hfQkFTRSArIG1vbml0b3JfZmxhc2hfbGVuIC0gMSwKKwkJCSZmbGFzaF9pbmZvWzBdICk7CisKKwlmbGFzaF9wcm90ZWN0ICggRkxBR19QUk9URUNUX1NFVCwKKwkJCUNGR19FTlZfQUREUiwKKwkJCUNGR19FTlZfQUREUiArIENGR19FTlZfU0laRSAtIDEsICZmbGFzaF9pbmZvWzBdICk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCBmbGFzaF9nZXRfb2Zmc2V0cyAodWxvbmcgYmFzZSwgZmxhc2hfaW5mb190ICppbmZvKQoreworCWludCBpOworCisJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcmV0dXJuOworCX0KKworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX0lOVEVMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiBQSFlTX0ZMQVNIX1NFQ1RfU0laRSk7CisJCQlpbmZvLT5wcm90ZWN0W2ldID0gMDsKKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKwlpbnQgaTsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZiAoIm1pc3Npbmcgb3IgdW5rbm93biBGTEFTSCB0eXBlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCWNhc2UgRkxBU0hfTUFOX0lOVEVMOgorCQlwcmludGYgKCJJTlRFTCAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCWNhc2UgRkxBU0hfMjhGMTI4SjNBOgorCQlwcmludGYgKCIyOEYxMjhKM0FcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIENoaXAgVHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCXByaW50ZiAoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCisJCQlpbmZvLT5zaXplID4+IDIwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCisJcHJpbnRmICgiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7ICsraSkgeworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4gICAiKTsKKwkJcHJpbnRmICgiICUwOGxYJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworCX0KKwlwcmludGYgKCJcbiIpOworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW5ub3QgYmUgcnVuIGZyb20gRkxBU0ghCisgKi8KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAoRlBXICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJdm9sYXRpbGUgRlBXIHZhbHVlOworCisJLyogV3JpdGUgYXV0byBzZWxlY3QgY29tbWFuZDogcmVhZCBNYW51ZmFjdHVyZXIgSUQgKi8KKwlhZGRyWzB4NTU1NV0gPSAoRlBXKSAweDAwQUEwMEFBOworCWFkZHJbMHgyQUFBXSA9IChGUFcpIDB4MDA1NTAwNTU7CisJYWRkclsweDU1NTVdID0gKEZQVykgMHgwMDkwMDA5MDsKKworCW1iICgpOworCXZhbHVlID0gYWRkclswXTsKKworCXN3aXRjaCAodmFsdWUpIHsKKworCWNhc2UgKEZQVykgSU5URUxfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0lOVEVMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMDsKKwkJaW5mby0+c2l6ZSA9IDA7CisJCWFkZHJbMF0gPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworCQlyZXR1cm4gKDApOwkJCS8qIG5vIG9yIHVua25vd24gZmxhc2ggICovCisJfQorCisJbWIgKCk7CisJdmFsdWUgPSBhZGRyWzFdOwkJCS8qIGRldmljZSBJRCAgICAgICAgKi8KKworCXN3aXRjaCAodmFsdWUpIHsKKworCWNhc2UgKEZQVykgSU5URUxfSURfMjhGMTI4SjNBOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF8yOEYxMjhKM0E7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDEyODsKKwkJaW5mby0+c2l6ZSA9IDB4MDIwMDAwMDA7CisJCWJyZWFrOwkJCQkvKiA9PiAxNiBNQiAgICAgKi8KKworCWRlZmF1bHQ6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGluZm8tPnNlY3Rvcl9jb3VudCA+IENGR19NQVhfRkxBU0hfU0VDVCkgeworCQlwcmludGYgKCIqKiBFUlJPUjogc2VjdG9yIGNvdW50ICVkID4gbWF4ICglZCkgKipcbiIsCisJCQlpbmZvLT5zZWN0b3JfY291bnQsIENGR19NQVhfRkxBU0hfU0VDVCk7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IENGR19NQVhfRkxBU0hfU0VDVDsKKwl9CisKKwlhZGRyWzBdID0gKEZQVykgMHgwMEZGMDBGRjsJCS8qIHJlc3RvcmUgcmVhZCBtb2RlICovCisKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQgZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJaW50IGZsYWcsIHByb3QsIHNlY3Q7CisJdWxvbmcgdHlwZSwgc3RhcnQsIGxhc3Q7CisJaW50IHJjb2RlID0gMDsKKworCWlmICgoc19maXJzdCA8IDApIHx8IChzX2ZpcnN0ID4gc19sYXN0KSkgeworCQlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworCQkJcHJpbnRmICgiLSBtaXNzaW5nXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJdHlwZSA9IChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKTsKKwlpZiAoKHR5cGUgIT0gRkxBU0hfTUFOX0lOVEVMKSkgeworCQlwcmludGYgKCJDYW4ndCBlcmFzZSB1bmtub3duIGZsYXNoIHR5cGUgJTA4bHggLSBhYm9ydGVkXG4iLAorCQkJaW5mby0+Zmxhc2hfaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcm90ID0gMDsKKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgKytzZWN0KSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKSB7CisJCQlwcm90Kys7CisJCX0KKwl9CisKKwlpZiAocHJvdCkgeworCQlwcmludGYgKCItIFdhcm5pbmc6ICVkIHByb3RlY3RlZCBzZWN0b3JzIHdpbGwgbm90IGJlIGVyYXNlZCFcbiIsCisJCQlwcm90KTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJcbiIpOworCX0KKworCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwlsYXN0ID0gc3RhcnQ7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJCQlGUFdWICphZGRyID0gKEZQV1YgKikgKGluZm8tPnN0YXJ0W3NlY3RdKTsKKwkJCUZQVyBzdGF0dXM7CisKKwkJCXByaW50ZiAoIkVyYXNpbmcgc2VjdG9yICUyZCAuLi4gIiwgc2VjdCk7CisKKwkJCS8qIGFybSBzaW1wbGUsIG5vbiBpbnRlcnJ1cHQgZGVwZW5kZW50IHRpbWVyICovCisJCQlyZXNldF90aW1lcl9tYXNrZWQgKCk7CisKKwkJCSphZGRyID0gKEZQVykgMHgwMDUwMDA1MDsJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyICovCisJCQkqYWRkciA9IChGUFcpIDB4MDAyMDAwMjA7CS8qIGVyYXNlIHNldHVwICovCisJCQkqYWRkciA9IChGUFcpIDB4MDBEMDAwRDA7CS8qIGVyYXNlIGNvbmZpcm0gKi8KKworCQkJd2hpbGUgKCgoc3RhdHVzID0gKmFkZHIpICYgKEZQVykgMHgwMDgwMDA4MCkgIT0gKEZQVykgMHgwMDgwMDA4MCkgeworCQkJCWlmIChnZXRfdGltZXJfbWFza2VkICgpID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCQkJcHJpbnRmICgiVGltZW91dFxuIik7CisJCQkJCSphZGRyID0gKEZQVykgMHgwMEIwMDBCMDsJLyogc3VzcGVuZCBlcmFzZSAgICAgKi8KKwkJCQkJKmFkZHIgPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKwkJCQkJcmNvZGUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCSphZGRyID0gMHgwMDUwMDA1MDsJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNtZC4gICAqLworCQkJKmFkZHIgPSAweDAwRkYwMEZGOwkvKiByZXNlc3QgdG8gcmVhZCBtb2RlICAgICAgICAgICovCisKKwkJCXByaW50ZiAoIiBkb25lXG4iKTsKKwkJfQorCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqIDQgLSBGbGFzaCBub3QgaWRlbnRpZmllZAorICovCisKK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKmluZm8sIHVjaGFyICpzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwl1bG9uZyBjcCwgd3A7CisJRlBXIGRhdGE7CisJaW50IGNvdW50LCBpLCBsLCByYywgcG9ydF93aWR0aDsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXJldHVybiA0OworCX0KKy8qIGdldCBsb3dlciB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLworI2lmZGVmIEZMQVNIX1BPUlRfV0lEVEgxNgorCXdwID0gKGFkZHIgJiB+MSk7CisJcG9ydF93aWR0aCA9IDI7CisjZWxzZQorCXdwID0gKGFkZHIgJiB+Myk7CisJcG9ydF93aWR0aCA9IDQ7CisjZW5kaWYKKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCQl9CisJCWZvciAoOyBpIDwgcG9ydF93aWR0aCAmJiBjbnQgPiAwOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJCS0tY250OworCQkJKytjcDsKKwkJfQorCQlmb3IgKDsgY250ID09IDAgJiYgaSA8IHBvcnRfd2lkdGg7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCQl9CisKKwkJaWYgKChyYyA9IHdyaXRlX2RhdGEgKGluZm8sIHdwLCBTV0FQIChkYXRhKSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICs9IHBvcnRfd2lkdGg7CisJfQorCisJLyoKKwkgKiBoYW5kbGUgd29yZCBhbGlnbmVkIHBhcnQKKwkgKi8KKwljb3VudCA9IDA7CisJd2hpbGUgKGNudCA+PSBwb3J0X3dpZHRoKSB7CisJCWRhdGEgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgcG9ydF93aWR0aDsgKytpKSB7CisJCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAqc3JjKys7CisJCX0KKwkJaWYgKChyYyA9IHdyaXRlX2RhdGEgKGluZm8sIHdwLCBTV0FQIChkYXRhKSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICs9IHBvcnRfd2lkdGg7CisJCWNudCAtPSBwb3J0X3dpZHRoOworCQlpZiAoY291bnQrKyA+IDB4ODAwKSB7CisJCQlzcGluX3doZWVsICgpOworCQkJY291bnQgPSAwOworCQl9CisJfQorCisJaWYgKGNudCA9PSAwKSB7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBoYW5kbGUgdW5hbGlnbmVkIHRhaWwgYnl0ZXMKKwkgKi8KKwlkYXRhID0gMDsKKwlmb3IgKGkgPSAwLCBjcCA9IHdwOyBpIDwgcG9ydF93aWR0aCAmJiBjbnQgPiAwOyArK2ksICsrY3ApIHsKKwkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQktLWNudDsKKwl9CisJZm9yICg7IGkgPCBwb3J0X3dpZHRoOyArK2ksICsrY3ApIHsKKwkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCX0KKworCXJldHVybiAod3JpdGVfZGF0YSAoaW5mbywgd3AsIFNXQVAgKGRhdGEpKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCBvciBoYWxmd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfZGF0YSAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCBGUFcgZGF0YSkKK3sKKwlGUFdWICphZGRyID0gKEZQV1YgKikgZGVzdDsKKwl1bG9uZyBzdGF0dXM7CisJaW50IGZsYWc7CisKKwkvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KKwlpZiAoKCphZGRyICYgZGF0YSkgIT0gZGF0YSkgeworCQlwcmludGYgKCJub3QgZXJhc2VkIGF0ICUwOGx4ICglbHgpXG4iLCAodWxvbmcpIGFkZHIsICphZGRyKTsKKwkJcmV0dXJuICgyKTsKKwl9CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCSphZGRyID0gKEZQVykgMHgwMDQwMDA0MDsJLyogd3JpdGUgc2V0dXAgKi8KKwkqYWRkciA9IGRhdGE7CisKKwkvKiBhcm0gc2ltcGxlLCBub24gaW50ZXJydXB0IGRlcGVuZGVudCB0aW1lciAqLworCXJlc2V0X3RpbWVyX21hc2tlZCAoKTsKKworCS8qIHdhaXQgd2hpbGUgcG9sbGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJd2hpbGUgKCgoc3RhdHVzID0gKmFkZHIpICYgKEZQVykgMHgwMDgwMDA4MCkgIT0gKEZQVykgMHgwMDgwMDA4MCkgeworCQlpZiAoZ2V0X3RpbWVyX21hc2tlZCAoKSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7CisJCQkqYWRkciA9IChGUFcpIDB4MDBGRjAwRkY7CS8qIHJlc3RvcmUgcmVhZCBtb2RlICovCisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisJKmFkZHIgPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworCisJcmV0dXJuICgwKTsKK30KKwordm9pZCBpbmxpbmUgc3Bpbl93aGVlbCAodm9pZCkKK3sKKwlzdGF0aWMgaW50IHAgPSAwOworCXN0YXRpYyBjaGFyIHdbXSA9ICJcXC8tIjsKKworCXByaW50ZiAoIlwwMTAlYyIsIHdbcF0pOworCSgrK3AgPT0gMykgPyAocCA9IDApIDogMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3hhZW5pYXgvbWVtc2V0dXAuUyBiL2JvYXJkL3hhZW5pYXgvbWVtc2V0dXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQzYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQveGFlbmlheC9tZW1zZXR1cC5TCkBAIC0wLDAgKzEsNDI0IEBACisgLyoKKyAqIE1vc3Qgb2YgdGhpcyB0YWtlbiBmcm9tIFJlZGJvb3QgaGFsX3BsYXRmb3JtX3NldHVwLmggd2l0aCBjbGVhbnVwCisgKgorICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKKyAqIHJ1bm5pbmcuIFNlZSBoYWxfcGxhdGZvcm1fc2V0dXAuaCBmb3IgdGhlIHNvdXJjZS4gU2VlCisgKiBib2FyZC9jcmFkbGUvbWVtc2V0dXAuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcworICogbXVjaCBjbGVhbmVyLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworRFJBTV9TSVpFOiAgLmxvbmcgICBDRkdfRFJBTV9TSVpFCisKKy8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCisJLm1hY3JvIENQV0FJVCByZWcKKwltcmMgIHAxNSwwLFxyZWcsYzIsYzAsMAorCW1vdiAgXHJlZyxccmVnCisJc3ViICBwYyxwYywjNAorCS5lbmRtCisKKworLmdsb2JsIG1lbXNldHVwCittZW1zZXR1cDoKKworCW1vdgkgcjEwLCBscgorCisJLyogU2V0IHVwIEdQSU8gcGlucyBmaXJzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJbGRyCXIwLD1HUFNSMAorCWxkcglyMSw9Q0ZHX0dQU1IwX1ZBTAorCXN0cglyMSxbcjBdCisKKwlsZHIJcjAsPUdQU1IxCisJbGRyCXIxLD1DRkdfR1BTUjFfVkFMCisJc3RyCXIxLFtyMF0KKworCWxkcglyMCw9R1BTUjIKKwlsZHIJcjEsPUNGR19HUFNSMl9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HUENSMAorCWxkcglyMSw9Q0ZHX0dQQ1IwX1ZBTAorCXN0cglyMSxbcjBdCisKKwlsZHIJcjAsPUdQQ1IxCisJbGRyCXIxLD1DRkdfR1BDUjFfVkFMCisJc3RyCXIxLFtyMF0KKworCWxkcglyMCw9R1BDUjIKKwlsZHIJcjEsPUNGR19HUENSMl9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HUERSMAorCWxkcglyMSw9Q0ZHX0dQRFIwX1ZBTAorCXN0cglyMSxbcjBdCisKKwlsZHIJcjAsPUdQRFIxCisJbGRyCXIxLD1DRkdfR1BEUjFfVkFMCisJc3RyCXIxLFtyMF0KKworCWxkcglyMCw9R1BEUjIKKwlsZHIJcjEsPUNGR19HUERSMl9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HQUZSMF9MCisJbGRyCXIxLD1DRkdfR0FGUjBfTF9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HQUZSMF9VCisJbGRyCXIxLD1DRkdfR0FGUjBfVV9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HQUZSMV9MCisJbGRyCXIxLD1DRkdfR0FGUjFfTF9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HQUZSMV9VCisJbGRyCXIxLD1DRkdfR0FGUjFfVV9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HQUZSMl9MCisJbGRyCXIxLD1DRkdfR0FGUjJfTF9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1HQUZSMl9VCisJbGRyCXIxLD1DRkdfR0FGUjJfVV9WQUwKKwlzdHIJcjEsW3IwXQorCisJbGRyCXIwLD1QU1NSCQkvKiBlbmFibGUgR1BJTyBwaW5zICovCisJbGRyCXIxLD1DRkdfUFNTUl9WQUwKKwlzdHIJcjEsW3IwXQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEVuYWJsZSBtZW1vcnkgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogVGhlIHNlcXVlbmNlIGJlbG93IGlzIGJhc2VkIG9uIHRoZSByZWNvbW1lbmRlZCBpbml0IHN0ZXBzICAgICAgICAqLworCS8qIGRldGFpbGVkIGluIHRoZSBJbnRlbCBQWEEyNTAgT3BlcmF0aW5nIFN5c3RlbXMgRGV2ZWxvcGVycyBHdWlkZSwgKi8KKwkvKiBDaGFwdGVyIDEwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMTogV2FpdCBmb3IgYXQgbGVhc3QgMjAwIG1pY3Jvc2Vkb25kcyB0byBhbGxvdyBpbnRlcm5hbCAgICAgKi8KKwkvKiAgICAgICAgIGNsb2NrcyB0byBzZXR0bGUuIE9ubHkgbmVjZXNzYXJ5IGFmdGVyIGhhcmQgcmVzZXQuLi4gICAgICovCisJLyogICAgICAgICBGSVhNRTogY2FuIGJlIG9wdGltaXplZCBsYXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWxkcglyMywgPU9TQ1IJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCisJbW92CXIyLCAjMAorCXN0cglyMiwgW3IzXQorCWxkcglyNCwgPTB4MzAwCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLworCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5ICAgICAgICAqLworMToKKwlsZHIJcjIsIFtyM10KKwljbXAJcjQsIHIyCisJYmd0CTFiCisKK21lbV9pbml0OgorCisJbGRyCXIxLD1NRU1DX0JBU0UJCS8qIGdldCBtZW1vcnkgY29udHJvbGxlciBiYXNlIGFkZHIuICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCAyYTogSW5pdGlhbGl6ZSBBc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeSBjb250cm9sbGVyICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIE1TQyByZWdpc3RlcnM6IHRpbWluZywgYnVzIHdpZHRoLCBtZW0gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCS8qIE1TQzA6IG5DUygwLDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIgICAgIHIyLD1DRkdfTVNDMF9WQUwKKwlzdHIgICAgIHIyLFtyMSwgI01TQzBfT0ZGU0VUXQorCWxkciAgICAgcjIsW3IxLCAjTVNDMF9PRkZTRVRdCS8qIHJlYWQgYmFjayB0byBlbnN1cmUgZGF0YSBsYXRjaGVzICovCisKKwkvKiBNU0MxOiBuQ1MoMiwzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJbGRyICAgICByMiw9Q0ZHX01TQzFfVkFMCisJc3RyICAgICByMixbcjEsICNNU0MxX09GRlNFVF0KKwlsZHIgICAgIHIyLFtyMSwgI01TQzFfT0ZGU0VUXQorCisJLyogTVNDMjogbkNTKDQsNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NU0MyX1ZBTAorCXN0ciAgICAgcjIsW3IxLCAjTVNDMl9PRkZTRVRdCisJbGRyICAgICByMixbcjEsICNNU0MyX09GRlNFVF0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDJiOiBJbml0aWFsaXplIENhcmQgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogTUVDUjogTWVtb3J5IEV4cGFuc2lvbiBDYXJkIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NRUNSX1ZBTAorCXN0ciAgICAgcjIsW3IxLCAjTUVDUl9PRkZTRVRdCisJbGRyCXIyLFtyMSwgI01FQ1JfT0ZGU0VUXQorCisJLyogTUNNRU0wOiBDYXJkIEludGVyZmFjZSBzbG90IDAgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NQ01FTTBfVkFMCisJc3RyICAgICByMixbcjEsICNNQ01FTTBfT0ZGU0VUXQorCWxkcglyMixbcjEsICNNQ01FTTBfT0ZGU0VUXQorCisJLyogTUNNRU0xOiBDYXJkIEludGVyZmFjZSBzbG90IDEgdGltaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NQ01FTTFfVkFMCisJc3RyICAgICByMixbcjEsICNNQ01FTTFfT0ZGU0VUXQorCWxkcglyMixbcjEsICNNQ01FTTFfT0ZGU0VUXQorCisJLyogTUNBVFQwOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NQ0FUVDBfVkFMCisJc3RyICAgICByMixbcjEsICNNQ0FUVDBfT0ZGU0VUXQorCWxkcglyMixbcjEsICNNQ0FUVDBfT0ZGU0VUXQorCisJLyogTUNBVFQxOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NQ0FUVDFfVkFMCisJc3RyICAgICByMixbcjEsICNNQ0FUVDFfT0ZGU0VUXQorCWxkcglyMixbcjEsICNNQ0FUVDFfT0ZGU0VUXQorCisJLyogTUNJTzA6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NQ0lPMF9WQUwKKwlzdHIgICAgIHIyLFtyMSwgI01DSU8wX09GRlNFVF0KKwlsZHIJcjIsW3IxLCAjTUNJTzBfT0ZGU0VUXQorCisJLyogTUNJTzE6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjIsPUNGR19NQ0lPMV9WQUwKKwlzdHIgICAgIHIyLFtyMSwgI01DSU8xX09GRlNFVF0KKwlsZHIJcjIsW3IxLCAjTUNJTzFfT0ZGU0VUXQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMmM6IFdyaXRlIEZMWUNORkcgIEZJWE1FOiB3aGF0J3MgdGhhdD8/PyAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1pbmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCUAgZ2V0IHRoZSBtZHJlZnIgc2V0dGluZ3MKKwlsZHIgICAgIHI0LD1DRkdfTURSRUZSX1ZBTAorCisJQCB3cml0ZSBiYWNrIG1kcmVmcgorCXN0ciAgICAgcjQsW3IxLCAjTURSRUZSX09GRlNFVF0KKwlsZHIgICAgIHI0LFtyMSwgI01EUkVGUl9PRkZTRVRdCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCAzOiBJbml0aWFsaXplIFN5bmNocm9ub3VzIFN0YXRpYyBNZW1vcnkgKEZsYXNoL1BlcmlwaGVyYWxzKSAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIEluaXRpYWxpemUgU1hDTkZHIHJlZ2lzdGVyLiBBc3NlcnQgdGhlIGVuYWJsZSBiaXRzICAgICAgICAgICAgICAgKi8KKworCS8qIFdyaXRlIFNYTVJTIHRvIGNhdXNlIGFuIE1SUyBjb21tYW5kIHRvIGFsbCBlbmFibGVkIGJhbmtzIG9mICAgICAgKi8KKwkvKiBzeW5jaHJvbm91cyBzdGF0aWMgbWVtb3J5LiBOb3RlIHRoYXQgU1hMQ1IgbmVlZCBub3QgYmUgd3JpdHRlbiAgICovCisJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLyogRklYTUU6IHdlIHVzZSBhc3luYyBtb2RlIGZvciBub3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgNDogSW5pdGlhbGl6ZSBTRFJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlAIHNldCBLMVJVTiBmb3IgYmFuayAwCisJQAorCW9yciAgIHI0LCAgcjQsICAjTURSRUZSX0sxUlVOCisKKwlAIHdyaXRlIGJhY2sgbWRyZWZyCisJQAorCXN0ciAgICAgcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCWxkciAgICAgcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCisJQCBkZWFzc2VydCBTTEZSU0gKKwlACisJYmljICAgICByNCwgIHI0LCAgI01EUkVGUl9TTEZSU0gKKworCUAgd3JpdGUgYmFjayBtZHJlZnIKKwlACisJc3RyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCisJbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCisKKwlAIGFzc2VydCBFMVBJTgorCUAgaWYgRTBQSU4gaXMgYWxzbyB1c2VkOgkgIyhNRFJFRlJfRTFQSU58TURSRUZSX0UwUElOKQorCW9yciAgICAgcjQsICByNCwgIyhNRFJFRlJfRTFQSU4pCisKKwlAIHdyaXRlIGJhY2sgbWRyZWZyCisJQAorCXN0ciAgICAgcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCWxkciAgICAgcjQsICBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCW5vcAorCW5vcAorCisJLyogU3RlcCA0ZDoJCQkJCQkJKi8KKwkvKiBmZXRjaCBwbGF0Zm9ybSB2YWx1ZSBvZiBtZGNuZmcJCQkJKi8KKwlACisJbGRyICAgICByMiwgID1DRkdfTURDTkZHX1ZBTAorCisJQCBkaXNhYmxlIGFsbCBzZHJhbSBiYW5rcworCUAKKwliaWMgICAgIHIyLCAgcjIsICAjKE1EQ05GR19ERTAgfCBNRENORkdfREUxKQorCWJpYyAgICAgcjIsICByMiwgICMoTURDTkZHX0RFMiB8IE1EQ05GR19ERTMpCisKKwlAIHByb2dyYW0gYmFua3MgMC8xIGZvciBidXMgd2lkdGgKKwlACisJYmljICAgcjIsICByMiwgICNNRENORkdfRFdJRDAgICAgICBAMD0zMi1iaXQKKworCUAgd3JpdGUgaW5pdGlhbCB2YWx1ZSBvZiBtZGNuZmcsIHcvbyBlbmFibGluZyBzZHJhbSBiYW5rcworCUAKKwlzdHIgICAgIHIyLCAgW3IxLCAjTURDTkZHX09GRlNFVF0KKworCS8qIFN0ZXAgNGU6IFdhaXQgZm9yIHRoZSBjbG9jayB0byB0aGUgU0RSQU1zIHRvIHN0YWJpbGl6ZSwgICAgICAgICAgKi8KKwkvKiAgICAgICAgICAxMDAuLjIwMCC1c2VjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwlsZHIJcjMsID1PU0NSCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLworCW1vdglyMiwgIzAKKwlzdHIJcjIsIFtyM10KKwlsZHIJcjQsID0weDMwMAkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KKwkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KKzE6CisJbGRyCXIyLCBbcjNdCisJY21wCXI0LCByMgorCWJndAkxYgorCisKKwkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCisJLyogICAgICAgICAgYXR0ZW1wdGluZyBub24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLworCS8qICAgICAgICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KKwkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCisJLyogICAgICAgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBjYWNoZWFibGUuICAgICAgICAgICAgICAgICAqLworCisJbGRyCXIzLAk9Q0ZHX0RSQU1fQkFTRQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCisKKwkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBlbmFibGUgYml0cyBhc3NlcnRlZCAgICAgICAgICAgICAgICAgICovCisJLyogZ2V0IG1lbW9yeSBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjEsICA9TUVNQ19CQVNFCisKKwlAZmV0Y2ggY3VycmVudCBtZGNuZmcgdmFsdWUKKwlACisJbGRyICAgICByMywgIFtyMSwgI01EQ05GR19PRkZTRVRdCisKKwlAZW5hYmxlIHNkcmFtIGJhbmsgMCBpZiBpbnN0YWxsZWQgKG11c3QgZG8gZm9yIGFueSBwb3B1bGF0ZWQgYmFuaykKKwlACisJb3JyICAgICByMywgIHIzLCAgI01EQ05GR19ERTAKKworCUB3cml0ZSBiYWNrIG1kY25mZywgZW5hYmxpbmcgdGhlIHNkcmFtIGJhbmsocykKKwlACisJc3RyICAgICByMywgIFtyMSwgI01EQ05GR19PRkZTRVRdCisKKwkvKiBTdGVwIDRoOiBXcml0ZSBNRE1SUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwlsZHIgICAgIHIyLAk9Q0ZHX01ETVJTX1ZBTAorCXN0ciAgICAgcjIsCVtyMSwgI01ETVJTX09GRlNFVF0KKworCisJLyogV2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNhdGlvbiAgICAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5pdGlycXM6CisJbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KKwlsZHIgICAgIHIyLCAgPUlDTFIKKwlzdHIgICAgIHIxLCAgW3IyXQorCisJbGRyICAgICByMSwgID1DRkdfSUNNUl9WQUwgLyogbWFzayBhbGwgaW50ZXJydXB0cyBhdCB0aGUgY29udHJvbGxlciAqLworCWxkciAgICAgcjIsICA9SUNNUgorCXN0ciAgICAgcjEsICBbcjJdCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbml0Y2xrczoKKworCS8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2tzLCBhbmQgc2V0IHRoZSBjb3JlIGNsb2NrIGZyZXF1ZW5jeSAgKi8KKwkvKiAoaGFyZC1jb2RpbmcgYXQgMzk4LjEyTUh6IGZvciBub3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogVHVybiBPZmYgQUxMIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgZm9yIHJlLWNvbmZpZ3VyYXRpb24gICAgICAqLworCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KKwlsZHIgICAgIHIxLCAgPUNLRU4KKwltb3YgICAgIHIyLCAgIzAKKwlzdHIgICAgIHIyLCAgW3IxXQorCisKKwkvKiBkZWZhdWx0IHZhbHVlCQkJCQkJICAgICovCisJbGRyICAgICByMiwgPShDQ0NSX0wyN3xDQ0NSX00yfENDQ1JfTjEwKSAgLyogREVGQVVMVDogezIwMC8yMDAvMTAwfSAqLworCisJLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworCWxkciAgICAgcjEsICA9Q0NDUgorCXN0ciAgICAgcjIsICBbcjFdCisKKyNpZmRlZiBSVEMKKwkvKiBlbmFibGUgdGhlIDMyS2h6IG9zY2lsbGF0b3IgZm9yIFJUQyBhbmQgUG93ZXJNYW5hZ2VyICAgICAgICAgICAgICovCisKKwlsZHIgICAgIHIxLCAgPU9TQ0MKKwltb3YgICAgIHIyLCAgI09TQ0NfT09OCisJc3RyICAgICByMiwgIFtyMV0KKworCS8qIE5PVEU6ICBzcGluIGhlcmUgdW50aWwgT1NDQy5PT0sgZ2V0IHNldCwgbWVhbmluZyB0aGUgUExMICAgICAgICAgKi8KKwkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCis2MDoKKwlsZHIgICAgIHIyLCBbcjFdCisJYW5kcyAgICByMiwgcjIsICMxCisJYmVxICAgICA2MGIKKyNlbmRpZgorCisJQCBUdXJuIG9uIG5lZWRlZCBjbG9ja3MKKwlACit0ZXN0OgorCWxkciAgICAgcjEsICA9Q0tFTgorCWxkciAgICAgcjIsICA9Q0ZHX0NLRU5fVkFMCisJc3RyICAgICByMiwgIFtyMV0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogU2F2ZSBTRFJBTSBzaXplID8qLworCWxkcglyMSwgPURSQU1fU0laRQorCXN0cglyOCwgW3IxXQorCisJLyogRklYTUUgKi8KKworI2RlZmluZSBOT0RFQlVHCisjaWZkZWYgTk9ERUJVRworCS8qRGlzYWJsZSBzb2Z0d2FyZSBhbmQgZGF0YSBicmVha3BvaW50cyAqLworCW1vdglyMCwjMAorCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KKwltY3IJcDE1LDAscjAsYzE0LGM5LDAgIC8qIGliY3IxICovCisJbWNyCXAxNSwwLHIwLGMxNCxjNCwwICAvKiBkYmNvbiAqLworCisJLypFbmFibGUgYWxsIGRlYnVnIGZ1bmN0aW9uYWxpdHkgKi8KKwltb3YJcjAsIzB4ODAwMDAwMDAKKwltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KKworI2VuZGlmCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogRW5kIG1lbXNldHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW5kbWVtc2V0dXA6CisKKwltb3YgICAgIHBjLCBscgpkaWZmIC0tZ2l0IGEvYm9hcmQveGFlbmlheC91LWJvb3QubGRzIGIvYm9hcmQveGFlbmlheC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzM3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC94YWVuaWF4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9weGEvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKwkudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorCV9fdV9ib290X2NtZF9lbmQgPSAuOworCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3hhZW5pYXgveGFlbmlheC5jIGIvYm9hcmQveGFlbmlheC94YWVuaWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmYjMxMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3hhZW5pYXgveGFlbmlheC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFZpbmNlbnQgRHViZXksIFhhIFNBLCB2aW5jZW50LmR1YmV5QHhhLWNoLmNvbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiBraGFycmlzQG5leHVzLXRlY2gubmV0CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogTWlzY2VsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMKKyAqLworCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCS8qIG1lbW9yeSBhbmQgY3B1LXNwZWVkIGFyZSBzZXR1cCBiZWZvcmUgcmVsb2NhdGlvbiAqLworCS8qIHNvIHdlIGRvIF9ub3RoaW5nXyBoZXJlICovCisKKwkvKiBhcmNoIG51bWJlciBvZiB4YWVuaWF4ICovCisJZ2QtPmJkLT5iaV9hcmNoX251bWJlciA9IDU4NTsKKworCS8qIGFkcmVzcyBvZiBib290IHBhcmFtZXRlcnMgKi8KKwlnZC0+YmQtPmJpX2Jvb3RfcGFyYW1zID0gMHhhMDAwMDEwMDsKKworCXJldHVybiAwOworfQorCitpbnQgYm9hcmRfbGF0ZV9pbml0KHZvaWQpCit7CisJc2V0ZW52KCJzdGRvdXQiLCAic2VyaWFsIik7CisJc2V0ZW52KCJzdGRlcnIiLCAic2VyaWFsIik7CisJcmV0dXJuIDA7Cit9CisKKworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCS8qCWdkLT5iZC0+YmlfZHJhbVsxXS5zdGFydCA9IFBIWVNfU0RSQU1fMjsqLworCS8qCWdkLT5iZC0+YmlfZHJhbVsxXS5zaXplID0gUEhZU19TRFJBTV8yX1NJWkU7Ki8KKwkvKglnZC0+YmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBQSFlTX1NEUkFNXzM7ICovCisJLyoJZ2QtPmJkLT5iaV9kcmFtWzJdLnNpemUgPSBQSFlTX1NEUkFNXzNfU0laRTsgKi8KKwkvKglnZC0+YmQtPmJpX2RyYW1bM10uc3RhcnQgPSBQSFlTX1NEUkFNXzQ7ICovCisJLyoJZ2QtPmJkLT5iaV9kcmFtWzNdLnNpemUgPSBQSFlTX1NEUkFNXzRfU0laRTsgKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3hhZW5pYXguaCBiL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5Nzg4YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmgKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFZpbmNlbnQgRHViZXksIFhhIFNBLCB2aW5jZW50LmR1YmV5QHhhLWNoLmNvbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiBraGFycmlzQG5leHVzLXRlY2gubmUKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIHhhZW5pYXggYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIElmIHdlIGFyZSBkZXZlbG9waW5nLCB3ZSBtaWdodCB3YW50IHRvIHN0YXJ0IGFybWJvb3QgZnJvbSByYW0KKyAqIHNvIHdlIE1VU1QgTk9UIGluaXRpYWxpemUgY3JpdGljYWwgcmVncyBsaWtlIG1lbS10aW1pbmcgLi4uCisgKi8KKyNkZWZpbmUgQ09ORklHX0lOSVRfQ1JJVElDQUwJCS8qIHVuZGVmIGZvciBkZXZlbG9waW5nICovCisKKy8qCisjdW5kZWYgQ09ORklHX0lOSVRfQ1JJVElDQUwKKyovCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisjZGVmaW5lIENPTkZJR19QWEEyNTAJCTEJLyogVGhpcyBpcyBhbiBQWEEyNTUgQ1BVICAgICovCisjZGVmaW5lIENPTkZJR19YQUVOSUFYCQkxCS8qIG9uIGEgeGFlbmlheCBib2FyZAkgICAgKi8KKworCisjZGVmaW5lIEJPQVJEX0xBVEVfSU5JVAkJMQorCisKKyN1bmRlZiBDT05GSUdfVVNFX0lSUQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfQlRVQVJUCSAgICAgICAxICAgICAgIC8qIHdlIHVzZSBCVFVBUlQgb24gWEFFTklBWCAqLworCisKKy8qIGFsbG93IHRvIG92ZXJ3cml0ZSBzZXJpYWwgYW5kIGV0aGFkZHIgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAorCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9IC8qIHZhbGlkIGJhdWRyYXRlcyAqLworCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESUFHIHwgQ0ZHX0NNRF9TRFJBTSAmIH5DT05GSUdfQ01EX0RUVCkKKworLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLworI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwODowMDozZToyNjowYTo1YgorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjY4LjIwMQorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTE5Mi4xNjguNjguNjIKKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAweDAwMTAwMDAwIgorI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJjb25zb2xlPXR0eVMxLDExNTIwMCIKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHMQkJCQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcyAqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sOyB0aGlzIGxpdmVzIGJlbG93IHRoZSB1cHBlcm1vc3QgMTI4IEtpQiB3aGljaCBhcmUKKyAqIHVzZWQgZm9yIHRoZSBSQU0gY29weSBvZiB0aGUgdWJvb3QgY29kZQorICovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAoQ0ZHX0VOVl9TSVpFICsgMTI4KjEwMjQpCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCQkxCisKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisKKyNpZmRlZiBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVAkJInUtYm9vdCQgIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCisjZWxzZQorI2RlZmluZSBDRkdfUFJPTVBUCQkidS1ib290PT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDRkdfREVWSUNFX05VTExERVYJMQorCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4YTA0MDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4YTA4MDAwMDAJLyogNCAuLi4gOCBNQiBpbiBEUkFNCSovCisKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHhhMTAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENGR19IWgkJCTM2ODY0MDAJCS8qIGluY3JlbWVudGVyIGZyZXE6IDMuNjg2NCBNSHogKi8KKyNkZWZpbmUgQ0ZHX0NQVVNQRUVECQkweDE0MQkJLyogc2V0IGNvcmUgY2xvY2sgdG8gNDAwLzIwMC8xMDAgTUh6ICovCisKKy8qCisgKiBQaHlzaWNhbCBNZW1vcnkgTWFwCisgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkgICAvKiB3ZSBoYXZlIDEgYmFua3MgKHBhcnRpdGlvbikgb2YgRFJBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4YTAwMDAwMDAgLyogU0RSQU0gQmFuayAjMSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDA0MDAwMDAwIC8qIDY0IE1CICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMgkJMHhhNDAwMDAwMCAvKiBTRFJBTSBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMl9TSVpFCTB4MDAwMDAwMDAgLyogMCBNQiAqLworI2RlZmluZSBQSFlTX1NEUkFNXzMJCTB4YTgwMDAwMDAgLyogU0RSQU0gQmFuayAjMyAqLworI2RlZmluZSBQSFlTX1NEUkFNXzNfU0laRQkweDAwMDAwMDAwIC8qIDAgTUIgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV80CQkweGFjMDAwMDAwIC8qIFNEUkFNIEJhbmsgIzQgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV80X1NJWkUJMHgwMDAwMDAwMCAvKiAwIE1CICovCisKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAwMDAwMDAwIC8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yCQkweDA0MDAwMDAwIC8qIEZsYXNoIEJhbmsgIzIgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF9TSVpFCQkweDAyMDAwMDAwIC8qIDMyIE1CICovCisjZGVmaW5lIFBIWVNfRkxBU0hfQkFOS19TSVpFCTB4MDIwMDAwMDAgLyogMzIgTUIgQmFua3MgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF9TRUNUX1NJWkUJMHgwMDA0MDAwMCAvKiAyNTYgS0Igc2VjdG9ycyAoeDIpICovCisKKyNkZWZpbmUgQ0ZHX0RSQU1fQkFTRQkJMHhhMDAwMDAwMAorI2RlZmluZSBDRkdfRFJBTV9TSVpFCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorCisvKgorICogRkxBU0ggYW5kIGVudmlyb25tZW50IG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMSAgICAvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTEyOCAgLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICAgICovCisKKy8qIHRpbWVvdXQgdmFsdWVzIGFyZSBpbiB0aWNrcyAqLworI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkoMjUqQ0ZHX0haKSAvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAkoMjUqQ0ZHX0haKSAvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAqLworCisvKiBGSVhNRSAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoUEhZU19GTEFTSF8xICsgMHg0MDAwMCkvKiBBZGRyIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4NDAwMDAJCQkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworCisvKgorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjaWZkZWYgQ09ORklHX1VTRV9JUlEKKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9JUlEJKDQqMTAyNCkJLyogSVJRIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklRCSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLworI2VuZGlmCisKKy8qCisgKiBTTVNDOTFDMTExIE5ldHdvcmsgQ2FyZAorICovCisjZGVmaW5lIENPTkZJR19EUklWRVJfU01DOTExMTEJCTEKKyNkZWZpbmUgQ09ORklHX1NNQzkxMTExX0JBU0UJCTB4MEMwMDAzMCAgLyogY2hpcCBzZWxlY3QgMyAgICAgICAgICovCisjZGVmaW5lIENPTkZJR19TTUNfVVNFXzMyX0JJVAkJMSAgICAgICAgICAvKiAzMiBiaXQgYnVzICAqLworI3VuZGVmICBDT05GSUdfU01DXzkxMTExX0VYVF9QSFkJCSAgIC8qIHdlIHVzZSBpbnRlcm5hbCBwaHkgICAqLworI3VuZGVmICBDT05GSUdfU0hPV19BQ1RJVklUWQorI2RlZmluZSBDT05GSUdfTkVUX1JFVFJZX0NPVU5UCQkxMAkgICAvKiAjIG9mIHJldHJpZXMgICAgICAgICAgKi8KKworLyoKKyAqIEdQSU8gc2V0dGluZ3MKKyAqLworCisvKgorICogR1AwNSA9PSBuVVNCUmVzZXQgIGlzIDEKKyAqIEdQMTAgPT0gQ0ZSZXNldCAgIGlzIDEKKyAqIEdQMTMgPT0gbkNGRGF0YUVuYWJsZSBpcyAxCisgKiBHUDE0ID09IG5DRkFkZHJFbmFibGUgaXMgMQorICogR1AxNSA9PSBuQ1MxICAgICAgaXMgMQorICogR1AyMSA9PSBDb21CcmRSZXNldCBpcyAxCisgKiBHUDI0ID09IFNGUk0gICAgICBpcyAxCisgKiBHUDI1ID09IFRYRCAgICAgICBpcyAxCisgKiBHUDMxID09IFNZTkMgICAgICBpcyAxCisgKiBHUDMzID09IG5DUzUgICAgICBpcyAxCisgKiBHUDM5ID09IEZGVFhEICAgICBpcyAxCisgKiBHUDQxID09IFJUUyAgICAgICBpcyAxCisgKiBHUDQzID09IEJUVFhEICAgICBpcyAxCisgKiBHUDQ1ID09IEJUUlRTICAgICBpcyAxCisgKiBHUDQ3ID09IFRYRCAgICAgICBpcyAxCisgKiBHUDQ4ID09IG5QT0UgICAgICBpcyAxCisgKiBHUDQ5ID09IG5QV0UgICAgICBpcyAxCisgKiBHUDUwID09IG5QSU9SICAgICBpcyAxCisgKiBHUDUxID09IG5QSU9XICAgICBpcyAxCisgKiBHUDUyID09IG5QQ0VbMV0gICBpcyAxCisgKiBHUDUzID09IG5QQ0VbMl0gICBpcyAxCisgKiBHUDU0ID09IG5QU0tUU0VMICBpcyAxCisgKiBHUDU1ID09IG5QUkVHICAgICBpcyAxCisgKiBHUDc4ID09IG5DUzIgICAgICBpcyAxCisgKiBHUDc5ID09IG5DUzMgICAgICBpcyAxCisgKiBHUDgwID09IG5DUzQgICAgICBpcyAxCisgKiBHUDgyID09IE5TU1BTRlJNICBpcyAxCisgKiBHUDgzID09IE5TU1BUWEQgICBpcyAxCisgKi8KKyNkZWZpbmUgQ0ZHX0dQU1IwX1ZBTAkJMHg4MzIwRTQyMAorI2RlZmluZSBDRkdfR1BTUjFfVkFMCQkweDAwRkZBQTgyCisjZGVmaW5lIENGR19HUFNSMl9WQUwJCTB4MDAwREMwMDAKKworLyoKKyAqIEdQMDMgPT0gTEFOUmVzZXQgIGlzIDAKKyAqIEdQMDYgPT0gVVNCV2FrZVVwICBpcyAwCisgKiBHUDExID09IFVTQkNvbnRyb2wgaXMgMAorICogR1AxMiA9PSBCdXp6ZXIgICAgIGlzIDAKKyAqIEdQMTYgPT0gUFdNMCAgICAgICBpcyAwCisgKiBHUDE3ID09IFBXTTEgICAgICAgaXMgMAorICogR1AyMyA9PSBTQ0xLICAgICAgaXMgMAorICogR1AzMCA9PSBTREFUQV9PVVQgaXMgMAorICogR1A4MSA9PSBOU1NQQ0xLICAgaXMgMAorICovCisjZGVmaW5lIENGR19HUENSMF9WQUwJCTB4NDBDMzE4NjgKKyNkZWZpbmUgQ0ZHX0dQQ1IxX1ZBTAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfR1BDUjJfVkFMCQkweDAwMDIwMDAwCisKKy8qCisgKiBHUDAwID09IENQVVdha2VVcFVTQiBpcyBpbnB1dAorICogR1AwMSA9PSBHUCByZXNldCBpcyBpbnB1dAorICogR1AwMiA9PSBMQU5JbnRlcnJ1cHQgaXMgaW5wdXQKKyAqIEdQMDMgPT0gTEFOUmVzZXQgICAgIGlzIG91dHB1dAorICogR1AwNCA9PSBVU0JJbnRlcnJ1cHQgaXMgaW5wdXQKKyAqIEdQMDUgPT0gblVTQlJlc2V0ICAgIGlzIG91dHB1dAorICogR1AwNiA9PSBVU0JXYWtlVXAgICAgaXMgb3V0cHV0CisgKiBHUDA3ID09IENGUmVhZHkvbkJ1c3kgaXMgaW5wdXQKKyAqIEdQMDggPT0gbkNGQ2FyZERldGVjdDEgaXMgaW5wdXQKKyAqIEdQMDkgPT0gbkNGQ2FyZERldGVjdDIgaXMgaW5wdXQKKyAqIEdQMTAgPT0gbkNGUmVzZXQgICBpcyBvdXRwdXQKKyAqIEdQMTEgPT0gVVNCQ29udHJvbCBpcyBvdXRwdXQKKyAqIEdQMTIgPT0gQnV6emVyICAgICBpcyBvdXRwdXQKKyAqIEdQMTMgPT0gQ0ZEYXRhRW5hYmxlIGlzIG91dHB1dAorICogR1AxNCA9PSBDRkFkZHJlc3NFbmFibGUgaXMgb3V0cHV0CisgKiBHUDE1ID09IG5DUzEgICAgICBpcyBvdXRwdXQKKyAqIEdQMTYgPT0gUFdNMCAgICAgIGlzIG91dHB1dAorICogR1AxNyA9PSBQV00xICAgICAgaXMgb3V0cHV0CisgKiBHUDE4ID09IFJEWSAgICAgICBpcyBpbnB1dAorICogR1AxOSA9PSBSZWFkZXJSZWFkeSBpcyBpbnB1dAorICogR1AyMCA9PSBSZWFkZXJSZXNldCBpcyBpbnB1dAorICogR1AyMSA9PSBDb21CcmRSZXNldCBpcyBvdXRwdXQKKyAqIEdQMjMgPT0gU0NMSyAgICAgIGlzIG91dHB1dAorICogR1AyNCA9PSBTRlJNICAgICAgaXMgb3V0cHV0CisgKiBHUDI1ID09IFRYRCAgICAgICBpcyBvdXRwdXQKKyAqIEdQMjYgPT0gUlhEICAgICAgIGlzIGlucHV0CisgKiBHUDI3ID09IEVYVENMSyAgICBpcyBpbnB1dAorICogR1AyOCA9PSBCSVRDTEsgICAgaXMgb3V0cHV0CisgKiBHUDI5ID09IFNEQVRBX0lOMCBpcyBpbnB1dAorICogR1AzMCA9PSBTREFUQV9PVVQgaXMgb3V0cHV0CisgKiBHUDMxID09IFNZTkMgICAgICBpcyBvdXRwdXQKKyAqIEdQMzIgPT0gU1lTU0NMSyAgIGlzIG91dHB1dAorICogR1AzMyA9PSBuQ1M1ICAgICAgaXMgb3V0cHV0CisgKiBHUDM0ID09IEZGUlhEICAgICBpcyBpbnB1dAorICogR1AzNSA9PSBDVFMgICAgICAgaXMgaW5wdXQKKyAqIEdQMzYgPT0gRENEICAgICAgIGlzIGlucHV0CisgKiBHUDM3ID09IERTUiAgICAgICBpcyBpbnB1dAorICogR1AzOCA9PSBSSSAgICAgICAgaXMgaW5wdXQKKyAqIEdQMzkgPT0gRkZUWEQgICAgIGlzIG91dHB1dAorICogR1A0MCA9PSBEVFIgICAgICAgaXMgb3V0cHV0CisgKiBHUDQxID09IFJUUyAgICAgICBpcyBvdXRwdXQKKyAqIEdQNDIgPT0gQlRSWEQgICAgIGlzIGlucHV0CisgKiBHUDQzID09IEJUVFhEICAgICBpcyBvdXRwdXQKKyAqIEdQNDQgPT0gQlRDVFMgICAgIGlzIGlucHV0CisgKiBHUDQ1ID09IEJUUlRTICAgICBpcyBvdXRwdXQKKyAqIEdQNDYgPT0gUlhEICAgICAgIGlzIGlucHV0CisgKiBHUDQ3ID09IFRYRCAgICAgICBpcyBvdXRwdXQKKyAqIEdQNDggPT0gblBPRSAgICAgIGlzIG91dHB1dAorICogR1A0OSA9PSBuUFdFICAgICAgaXMgb3V0cHV0CisgKiBHUDUwID09IG5QSU9SICAgICBpcyBvdXRwdXQKKyAqIEdQNTEgPT0gblBJT1cgICAgIGlzIG91dHB1dAorICogR1A1MiA9PSBuUENFWzFdICAgaXMgb3V0cHV0CisgKiBHUDUzID09IG5QQ0VbMl0gICBpcyBvdXRwdXQKKyAqIEdQNTQgPT0gblBTS1RTRUwgIGlzIG91dHB1dAorICogR1A1NSA9PSBuUFJFRyAgICAgaXMgb3V0cHV0CisgKiBHUDU2ID09IG5QV0FJVCAgICBpcyBpbnB1dAorICogR1A1NyA9PSBuUElPUzE2ICAgaXMgaW5wdXQKKyAqIEdQNTggPT0gTEREWzBdICAgIGlzIG91dHB1dAorICogR1A1OSA9PSBMRERbMV0gICAgaXMgb3V0cHV0CisgKiBHUDYwID09IExERFsyXSAgICBpcyBvdXRwdXQKKyAqIEdQNjEgPT0gTEREWzNdICAgIGlzIG91dHB1dAorICogR1A2MiA9PSBMRERbNF0gICAgaXMgb3V0cHV0CisgKiBHUDYzID09IExERFs1XSAgICBpcyBvdXRwdXQKKyAqIEdQNjQgPT0gTEREWzZdICAgIGlzIG91dHB1dAorICogR1A2NSA9PSBMRERbN10gICAgaXMgb3V0cHV0CisgKiBHUDY2ID09IExERFs4XSAgICBpcyBvdXRwdXQKKyAqIEdQNjcgPT0gTEREWzldICAgIGlzIG91dHB1dAorICogR1A2OCA9PSBMRERbMTBdICAgaXMgb3V0cHV0CisgKiBHUDY5ID09IExERFsxMV0gICBpcyBvdXRwdXQKKyAqIEdQNzAgPT0gTEREWzEyXSAgIGlzIG91dHB1dAorICogR1A3MSA9PSBMRERbMTNdICAgaXMgb3V0cHV0CisgKiBHUDcyID09IExERFsxNF0gICBpcyBvdXRwdXQKKyAqIEdQNzMgPT0gTEREWzE1XSAgIGlzIG91dHB1dAorICogR1A3NCA9PSBMQ0RfRkNMSyAgaXMgb3V0cHV0CisgKiBHUDc1ID09IExDRF9MQ0xLICBpcyBvdXRwdXQKKyAqIEdQNzYgPT0gTENEX1BDTEsgIGlzIG91dHB1dAorICogR1A3NyA9PSBMQ0RfQUNCSUFTIGlzIG91dHB1dAorICogR1A3OCA9PSBuQ1MyICAgICAgaXMgb3V0cHV0CisgKiBHUDc5ID09IG5DUzMgICAgICBpcyBvdXRwdXQKKyAqIEdQODAgPT0gbkNTNCAgICAgIGlzIG91dHB1dAorICogR1A4MSA9PSBOU1NQQ0xLICAgaXMgb3V0cHV0CisgKiBHUDgyID09IE5TU1BTRlJNICBpcyBvdXRwdXQKKyAqIEdQODMgPT0gTlNTUFRYRCAgIGlzIG91dHB1dAorICogR1A4NCA9PSBOU1NQUlhEICAgaXMgaW5wdXQKKyAqLworI2RlZmluZSBDRkdfR1BEUjBfVkFMCQkweEQzRTNGQzY4CisjZGVmaW5lIENGR19HUERSMV9WQUwJCTB4RkNGRkFCODMKKyNkZWZpbmUgQ0ZHX0dQRFIyX1ZBTAkJMHgwMDBGRkZGRgorCisvKgorICogR1AwMSA9PSBHUCByZXNldCBpcyBBRjAxCisgKiBHUDE1ID09IG5DUzEgICAgIGlzIEFGMTAKKyAqIEdQMTYgPT0gUFdNMCAgICAgaXMgQUYxMAorICogR1AxNyA9PSBQV00xICAgICBpcyBBRjEwCisgKiBHUDE4ID09IFJEWSAgICAgIGlzIEFGMDEKKyAqIEdQMjMgPT0gU0NMSyAgICAgaXMgQUYxMAorICogR1AyNCA9PSBTRlJNICAgICBpcyBBRjEwCisgKiBHUDI1ID09IFRYRCAgICAgIGlzIEFGMTAKKyAqIEdQMjYgPT0gUlhEICAgICAgaXMgQUYwMQorICogR1AyNyA9PSBFWFRDTEsgICBpcyBBRjAxCisgKiBHUDI4ID09IEJJVENMSyAgIGlzIEFGMDEKKyAqIEdQMjkgPT0gU0RBVEFfSU4wIGlzIEFGMTAKKyAqIEdQMzAgPT0gU0RBVEFfT1VUIGlzIEFGMDEKKyAqIEdQMzEgPT0gU1lOQyAgICAgaXMgQUYwMQorICogR1AzMiA9PSBTWVNDTEsgICBpcyBBRjAxCisgKiBHUDMzID09IG5DUzUgIGlzIEFGMTAKKyAqIEdQMzQgPT0gRkZSWEQgaXMgQUYwMQorICogR1AzNSA9PSBDVFMgICBpcyBBRjAxCisgKiBHUDM2ID09IERDRCAgIGlzIEFGMDEKKyAqIEdQMzcgPT0gRFNSICAgaXMgQUYwMQorICogR1AzOCA9PSBSSSAgICBpcyBBRjAxCisgKiBHUDM5ID09IEZGVFhEIGlzIEFGMTAKKyAqIEdQNDAgPT0gRFRSICAgaXMgQUYxMAorICogR1A0MSA9PSBSVFMgICBpcyBBRjEwCisgKiBHUDQyID09IEJUUlhEIGlzIEFGMDEKKyAqIEdQNDMgPT0gQlRUWEQgaXMgQUYxMAorICogR1A0NCA9PSBCVENUUyBpcyBBRjAxCisgKiBHUDQ1ID09IEJUUlRTIGlzIEFGMTAKKyAqIEdQNDYgPT0gUlhEICAgaXMgQUYxMAorICogR1A0NyA9PSBUWEQgICBpcyBBRjAxCisgKiBHUDQ4ID09IG5QT0UgIGlzIEFGMTAKKyAqIEdQNDkgPT0gblBXRSAgaXMgQUYxMAorICogR1A1MCA9PSBuUElPUiBpcyBBRjEwCisgKiBHUDUxID09IG5QSU9XIGlzIEFGMTAKKyAqIEdQNTIgPT0gblBDRVsxXSBpcyBBRjEwCisgKiBHUDUzID09IG5QQ0VbMl0gaXMgQUYxMAorICogR1A1NCA9PSBuUFNLVFNFTCBpcyBBRjEwCisgKiBHUDU1ID09IG5QUkVHICAgaXMgQUYxMAorICogR1A1NiA9PSBuUFdBSVQgIGlzIEFGMDEKKyAqIEdQNTcgPT0gblBJT1MxNiBpcyBBRjAxCisgKiBHUDU4ID09IExERFswXSAgaXMgQUYxMAorICogR1A1OSA9PSBMRERbMV0gIGlzIEFGMTAKKyAqIEdQNjAgPT0gTEREWzJdICBpcyBBRjEwCisgKiBHUDYxID09IExERFszXSAgaXMgQUYxMAorICogR1A2MiA9PSBMRERbNF0gIGlzIEFGMTAKKyAqIEdQNjMgPT0gTEREWzVdICBpcyBBRjEwCisgKiBHUDY0ID09IExERFs2XSAgaXMgQUYxMAorICogR1A2NSA9PSBMRERbN10gIGlzIEFGMTAKKyAqIEdQNjYgPT0gTEREWzhdICBpcyBBRjEwCisgKiBHUDY3ID09IExERFs5XSAgaXMgQUYxMAorICogR1A2OCA9PSBMRERbMTBdIGlzIEFGMTAKKyAqIEdQNjkgPT0gTEREWzExXSBpcyBBRjEwCisgKiBHUDcwID09IExERFsxMl0gaXMgQUYxMAorICogR1A3MSA9PSBMRERbMTNdIGlzIEFGMTAKKyAqIEdQNzIgPT0gTEREWzE0XSBpcyBBRjEwCisgKiBHUDczID09IExERFsxNV0gaXMgQUYxMAorICogR1A3NCA9PSBMQ0RfRkNMSyBpcyBBRjEwCisgKiBHUDc1ID09IExDRF9MQ0xLIGlzIEFGMTAKKyAqIEdQNzYgPT0gTENEX1BDTEsgaXMgQUYxMAorICogR1A3NyA9PSBMQ0RfQUNCSUFTIGlzIEFGMTAKKyAqIEdQNzggPT0gbkNTMiAgICAgaXMgQUYxMAorICogR1A3OSA9PSBuQ1MzICAgICBpcyBBRjEwCisgKiBHUDgwID09IG5DUzQgICAgIGlzIEFGMTAKKyAqIEdQODEgPT0gTlNTUENMSyAgaXMgQUYwMQorICogR1A4MiA9PSBOU1NQU0ZSTSBpcyBBRjAxCisgKiBHUDgzID09IE5TU1BUWEQgIGlzIEFGMDEKKyAqIEdQODQgPT0gTlNTUFJYRCAgaXMgQUYxMAorICovCisjZGVmaW5lIENGR19HQUZSMF9MX1ZBTAkJMHg4MDAwMDAwNAorI2RlZmluZSBDRkdfR0FGUjBfVV9WQUwJCTB4NTk1QTgwMUEKKyNkZWZpbmUgQ0ZHX0dBRlIxX0xfVkFMCQkweDY5OUE5NTU5CisjZGVmaW5lIENGR19HQUZSMV9VX1ZBTAkJMHhBQUE1QUFBQQorI2RlZmluZSBDRkdfR0FGUjJfTF9WQUwJCTB4QUFBQUFBQUEKKyNkZWZpbmUgQ0ZHX0dBRlIyX1VfVkFMCQkweDAwMDAwMjU2CisKKy8qCisgKiBjbG9jayBzZXR0aW5ncworICovCisvKiBSREggPSAxCisgKiBQSCAgPSAwCisgKiBWRlMgPSAwCisgKiBCRlMgPSAwCisgKiBTU1MgPSAwCisgKi8KKyNkZWZpbmUgQ0ZHX1BTU1JfVkFMCQkweDAwMDAwMDMwCisKKyNkZWZpbmUgQ0ZHX0NLRU5fVkFMICAgICAgICAgICAgMHgwMDAwMDA4MCAgLyogICovCisjZGVmaW5lIENGR19JQ01SX1ZBTCAgICAgICAgICAgIDB4MDAwMDAwMDAgIC8qIE5vIGludGVycnVwdHMgZW5hYmxlZCAgICAgICAgKi8KKworCisvKgorICogTWVtb3J5IHNldHRpbmdzCisgKgorICogVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgbkNTMC8xIC0+IGZsYXNoIGJhbmtzCisgKiBjb25maWd1cmF0aW9uIGZvciBuQ1MxIDoKKyAqIFszMV0gICAgMCAgICAtCisgKiBbMzA6MjhdIDAwMCAgLQorICogWzI3OjI0XSAwMDAwIC0KKyAqIFsyMzoyMF0gMDAwMCAtCisgKiBbMTldICAgIDAgICAgLQorICogWzE4OjE2XSAwMDAgIC0KKyAqIGNvbmZpZ3VyYXRpb24gZm9yIG5DUzA6CisgKiBbMTVdICAgIDAgICAgLSBTbG93ZXIgRGV2aWNlCisgKiBbMTQ6MTJdIDAxMCAgLSBDUyBkZXNlbGVjdCB0byBDUyB0aW1lOiAyKigyKk1lbUNsaykgPSA0MCBucworICogWzExOjA4XSAwMDExIC0gQWRkcmVzcyB0byBkYXRhIHZhbGlkIGluIGJ1cnN0czogKDMrMSkqTWVtQ2xrID0gNDAgbnMKKyAqIFswNzowNF0gMTExMSAtICIgZm9yIGZpcnN0IGFjY2VzczogKDIzKzIpKk1lbUNsayA9IDI1MCBucyAoZml4bWUgMTIrMj8pCisgKiBbMDNdICAgIDAgICAgLSAzMiBCaXQgYnVzIHdpZHRoCisgKiBbMDI6MDBdIDAxMCAgLSBidXJzdCBPRiA0IFJPTSBvciBGTEFTSAorKi8KKyNkZWZpbmUgQ0ZHX01TQzBfVkFMCQkweDAwMDAyM0QyCisKKy8qIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIG5DUzIvMyAtPiBVU0IgY29udHJvbGxlciwgTEFOCisgKiBjb25maWd1cmF0aW9uIGZvciBuQ1MzOiBMQU4KKyAqIFszMV0gICAgMCAgICAtIFNsb3dlciBEZXZpY2UKKyAqIFszMDoyOF0gMDAxICAtIFJSUjM6IENTIGRlc2VsZWN0IHRvIENTIHRpbWU6IDEqKDIqTWVtQ2xrKSA9IDIwIG5zCisgKiBbMjc6MjRdIDAwMTAgLSBSRE4zOiBBZGRyZXNzIHRvIGRhdGEgdmFsaWQgaW4gYnVyc3RzOiAoMisxKSpNZW1DbGsgPSAzMCBucworICogWzIzOjIwXSAwMDEwIC0gUkRGMzogQWRkcmVzcyBmb3IgZmlyc3QgYWNjZXNzOiAoMisxKSpNZW1DbGsgPSAzMCBucworICogWzE5XSAgICAwICAgIC0gMzIgQml0IGJ1cyB3aWR0aAorICogWzE4OjE2XSAxMDAgIC0gdmFyaWFibGUgbGF0ZW5jeSBJL08KKyAqIGNvbmZpZ3VyYXRpb24gZm9yIG5DUzI6IFVTQgorICogWzE1XSAgICAxICAgIC0gRmFzdGVyIERldmljZQorICogWzE0OjEyXSAwMTAgIC0gUlJSMjogQ1MgZGVzZWxlY3QgdG8gQ1MgdGltZTogMiooMipNZW1DbGspID0gNDAgbnMKKyAqIFsxMTowOF0gMDAxMCAtIFJETjI6IEFkZHJlc3MgdG8gZGF0YSB2YWxpZCBpbiBidXJzdHM6ICgyKzEpKk1lbUNsayA9IDMwIG5zCisgKiBbMDc6MDRdIDAxMTAgLSBSREYyOiBBZGRyZXNzIGZvciBmaXJzdCBhY2Nlc3M6ICg2KzEpKk1lbUNsayA9IDcwIG5zCisgKiBbMDNdICAgIDAgICAgLSAzMiBCaXQgYnVzIHdpZHRoCisgKiBbMDI6MDBdIDEwMCAgLSB2YXJpYWJsZSBsYXRlbmN5IEkvTworICovCisjZGVmaW5lIENGR19NU0MxX1ZBTAkJMHgxMjI0QTI2NAorCisvKiBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIGZvciBuQ1M0LzUgLT4gTEFOCisgKiBjb25maWd1cmF0aW9uIGZvciBuQ1M1OgorICogWzMxXSAgICAwICAgIC0KKyAqIFszMDoyOF0gMDAwICAtCisgKiBbMjc6MjRdIDAwMDAgLQorICogWzIzOjIwXSAwMDAwIC0KKyAqIFsxOV0gICAgMCAgICAtCisgKiBbMTg6MTZdIDAwMCAgLQorICogY29uZmlndXJhdGlvbiBmb3IgbkNTNDogTEFOCisgKiBbMTVdICAgIDEgICAgLSBGYXN0ZXIgRGV2aWNlCisgKiBbMTQ6MTJdIDAxMCAgLSBSUlIyOiBDUyBkZXNlbGVjdCB0byBDUyB0aW1lOiAyKigyKk1lbUNsaykgPSA0MCBucworICogWzExOjA4XSAwMDEwIC0gUkROMjogQWRkcmVzcyB0byBkYXRhIHZhbGlkIGluIGJ1cnN0czogKDIrMSkqTWVtQ2xrID0gMzAgbnMKKyAqIFswNzowNF0gMDExMCAtIFJERjI6IEFkZHJlc3MgZm9yIGZpcnN0IGFjY2VzczogKDYrMSkqTWVtQ2xrID0gNzAgbnMKKyAqIFswM10gICAgMCAgICAtIDMyIEJpdCBidXMgd2lkdGgKKyAqIFswMjowMF0gMTAwICAtIHZhcmlhYmxlIGxhdGVuY3kgSS9PCisgKi8KKyNkZWZpbmUgQ0ZHX01TQzJfVkFMCQkweDAwMDAxMjI0CisKKy8qIE1EQ05GRzogU0RSQU0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICoKKyAqIFszMToyOV0gICAwMDAgLSByZXNlcnZlZAorICogWzI4XSAgICAgIDAJIC0gbm8gU0ExMTExIGNvbXBhdGlibGl0eSBtb2RlCisgKiBbMjddICAgICAgMCAgIC0gbGF0Y2ggcmV0dXJuIGRhdGEgd2l0aCByZXR1cm4gY2xvY2sKKyAqIFsyNl0gICAgICAwICAgLSBhbHRlcm5hdGUgYWRkcmVzc2luZyBmb3IgcGFpciAyLzMKKyAqIFsyNToyNF0gICAwMCAgLSB0aW1pbmdzCisgKiBbMjNdICAgICAgMCAgIC0gaW50ZXJuYWwgYmFua3MgaW4gbG93ZXIgcGFydGl0aW9uIDIvMyAobm90IHVzZWQpCisgKiBbMjI6MjFdICAgMDAgIC0gcm93IGFkZHJlc3MgYml0cyBmb3IgcGFydGl0aW9uIDIvMyAobm90IHVzZWQpCisgKiBbMjA6MTldICAgMDAgIC0gY29sdW1uIGFkZHJlc3MgYml0cyBmb3IgcGFydGl0aW9uIDIvMyAobm90IHVzZWQpCisgKiBbMThdICAgICAgMCAgIC0gU0RSQU0gcGFydGl0aW9uIDIvMyB3aWR0aCBpcyAzMiBiaXQKKyAqIFsxN10gICAgICAwICAgLSBTRFJBTSBwYXJ0aXRpb24gMyBkaXNhYmxlZAorICogWzE2XSAgICAgIDAgICAtIFNEUkFNIHBhcnRpdGlvbiAyIGRpc2FibGVkCisgKiBbMTU6MTNdICAgMDAwIC0gcmVzZXJ2ZWQKKyAqIFsxMl0gICAgICAwCSAtIG5vIFNBMTExMSBjb21wYXRpYmxpdHkgbW9kZQorICogWzExXSAgICAgIDEgICAtIGxhdGNoIHJldHVybiBkYXRhIHdpdGggcmV0dXJuIGNsb2NrCisgKiBbMTBdICAgICAgMCAgIC0gbm8gYWx0ZXJuYXRlIGFkZHJlc3NpbmcgZm9yIHBhaXIgMC8xCisgKiBbMDk6MDhdICAgMTAgIC0gdFJQPTIqTWVtQ2xrIENMPTIgdFJDRD0yKk1lbUNsayB0UkFTPTUqTWVtQ2xrIHRSQz04Kk1lbUNsaworICogWzddICAgICAgIDEgICAtIDQgaW50ZXJuYWwgYmFua3MgaW4gbG93ZXIgcGFydGl0aW9uIHBhaXIKKyAqIFswNjowNV0gICAxMCAgLSAxMyByb3cgYWRkcmVzcyBiaXRzIGZvciBwYXJ0aXRpb24gMC8xCisgKiBbMDQ6MDNdICAgMDEgIC0gOSBjb2x1bW4gYWRkcmVzcyBiaXRzIGZvciBwYXJ0aXRpb24gMC8xCisgKiBbMDJdICAgICAgMCAgIC0gU0RSQU0gcGFydGl0aW9uIDAvMSB3aWR0aCBpcyAzMiBiaXQKKyAqIFswMV0gICAgICAwICAgLSBkaXNhYmxlIFNEUkFNIHBhcnRpdGlvbiAxCisgKiBbMDBdICAgICAgMSAgIC0gZW5hYmxlICBTRFJBTSBwYXJ0aXRpb24gMAorICovCisvKiB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gYWJvdmUgYnV0IGRpc2FibGUgcGFydGl0aW9uIDAgKi8KKyNkZWZpbmUgQ0ZHX01EQ05GR19WQUwJCTB4MDAwMDBBQzkKKworLyogTURSRUZSOiBTRFJBTSBSZWZyZXNoIENvbnRyb2wgUmVnaXN0ZXIKKyAqCisgKiBbMzI6MjZdIDAgICAgIC0gcmVzZXJ2ZWQKKyAqIFsyNV0gICAgMCAgICAgLSBLMkZSRUU6IG5vdCBmcmVlIHJ1bm5pbmcKKyAqIFsyNF0gICAgMCAgICAgLSBLMUZSRUU6IG5vdCBmcmVlIHJ1bm5pbmcKKyAqIFsyM10gICAgMCAgICAgLSBLMEZSRUU6IG5vdCBmcmVlIHJ1bm5pbmcKKyAqIFsyMl0gICAgMCAgICAgLSBTTEZSU0g6IHNlbGYgcmVmcmVzaCBkaXNhYmxlZAorICogWzIxXSAgICAwICAgICAtIHJlc2VydmVkCisgKiBbMjBdICAgIDEgICAgIC0gQVBEOiBhdXRvIHBvd2VyIGRvd24KKyAqIFsxOV0gICAgMCAgICAgLSBLMkRCMjogU0RDTEsyIGlzIE1lbUNsaworICogWzE4XSAgICAwICAgICAtIEsyUlVOOiBkaXNhYmxlIFNEQ0xLMgorICogWzE3XSAgICAwICAgICAtIEsxREIyOiBTRENMSzEgaXMgTWVtQ2xrCisgKiBbMTZdICAgIDEgICAgIC0gSzFSVU46IGVuYWJsZSBTRENMSzEKKyAqIFsxNV0gICAgMSAgICAgLSBFMVBJTjogU0RSQU0gY2xvY2sgZW5hYmxlCisgKiBbMTRdICAgIDAgICAgIC0gSzBEQjI6IFNEQ0xLMCBpcyBNZW1DbGsKKyAqIFsxM10gICAgMCAgICAgLSBLMFJVTjogZGlzYWJsZSBTRENMSzAKKyAqIFsxMl0gICAgMCAgICAgLSBFMFBJTjogZGlzYWJsZSBTRENLRTAKKyAqIFsxMTowMF0gMDAwMDAwMDExMDAwIC0gKDY0bXMvODE5MikqTWVtQ2xrRnJlcS8zMiA9IDI0CisgKi8KKyNkZWZpbmUgQ0ZHX01EUkVGUl9WQUwJCTB4MDAxMzgwMTggLyogbWg6IHdhcyAweDAwMTE4MDE4ICovCisKKy8qIE1ETVJTOiBNb2RlIFJlZ2lzdGVyIFNldCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgKgorICogWzMxXSAgICAgIDAgICAgICAgLSByZXNlcnZlZAorICogWzMwOjIzXSAgIDAwMDAwMDAwLSBNRE1SUzI6IFNEUkFNMi8zIE1SUyBWYWx1ZS4gKG5vdCB1c2VkKQorICogWzIyOjIwXSAgIDAxMSAgICAgLSBNRENMMjogIFNEUkFNMi8zIENhcyBMYXRlbmN5LiAgKG5vdCB1c2VkKQorICogWzE5XSAgICAgIDAgICAgICAgLSBNREFERDI6IFNEUkFNMi8zIGJ1cnN0IFR5cGUuIEZpeGVkIHRvIHNlcXVlbnRpYWwuICAobm90IHVzZWQpCisgKiBbMTg6MTZdICAgMDEwICAgICAtIE1EQkwyOiAgU0RSQU0yLzMgYnVyc3QgTGVuZ3RoLiBGaXhlZCB0byA0LiAgKG5vdCB1c2VkKQorICogWzE1XSAgICAgIDAgICAgICAgLSByZXNlcnZlZAorICogWzE0OjA3XSAgIDAwMDAwMDAwLSBNRE1SUzA6IFNEUkFNMC8xIE1SUyBWYWx1ZS4KKyAqIFswNjowNF0gICAwMTEgICAgIC0gTURDTDA6ICBTRFJBTTAvMSBDYXMgTGF0ZW5jeS4KKyAqIFswM10gICAgICAwICAgICAgIC0gTURBREQwOiBTRFJBTTAvMSBidXJzdCBUeXBlLiBGaXhlZCB0byBzZXF1ZW50aWFsLgorICogWzAyOjAwXSAgIDAxMCAgICAgLSBNREJMMDogIFNEUkFNMC8xIGJ1cnN0IExlbmd0aC4gRml4ZWQgdG8gNC4KKyAqLworI2RlZmluZSBDRkdfTURNUlNfVkFMCQkweDAwMzIwMDMyCisKKy8qCisgKiBQQ01DSUEgYW5kIENGIEludGVyZmFjZXMKKyAqLworI2RlZmluZSBDRkdfTUVDUl9WQUwJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX01DTUVNMF9WQUwJCTB4MDAwMTA1MDQKKyNkZWZpbmUgQ0ZHX01DTUVNMV9WQUwJCTB4MDAwMTA1MDQKKyNkZWZpbmUgQ0ZHX01DQVRUMF9WQUwJCTB4MDAwMTA1MDQKKyNkZWZpbmUgQ0ZHX01DQVRUMV9WQUwJCTB4MDAwMTA1MDQKKyNkZWZpbmUgQ0ZHX01DSU8wX1ZBTAkJMHgwMDAwNDcxNQorI2RlZmluZSBDRkdfTUNJTzFfVkFMCQkweDAwMDA0NzE1CisKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8K